package correctness;

import static org.junit.Assert.*;

import model.editormodel.EditorModel;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import view.UtilityConstants;
import controller.commoncontroller.UtilityDialogs;

/**
 * <b> Mit dieser Testklasse wird Folgendes getestet:</b> <br>
 * <br>
 * Es wird eine vorgefertigte XML-Datei mit einer Schaltung geladen und an-
 * schliessend ueberprueft ob die Elemente auch vollstaendig generiert wurden.
 * 
 */
public class SaveAndLoadCircuitTest {

	// Objekte die benoetigt werden
	private static EditorModel eModel;
	// Name der Schaltung, die geladen werden soll
	private static String name = "saveAndLoadTest";
	private static String location;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		eModel = new EditorModel();

		// Pfad der zu ladenden Schaltung
		location = "test" + UtilityConstants.SEPARATOR + "model"
				+ UtilityConstants.SEPARATOR + "editormodel"
				+ UtilityConstants.SEPARATOR + "test_saved_circuits"
				+ UtilityConstants.SEPARATOR + name
				+ UtilityDialogs.XML_EXTENSION;
	}

	@Before
	public void setUp() throws Exception {

	}

	@Test
	public void loadTest() {
		// Einlesen der vorbereiteten Schaltung
		assertTrue("Die Schaltung konnte nicht gelesen werden",
				eModel.loadCircuit(location));
		// nun werden die Anzahl und Typen der Elemente abgeprueft, dies
		// Pruefung ist abhängig von der vorbereiteten Schaltung!
		assertTrue("Die Anzahl der Subnetze ist abweichend", eModel
				.getCircuitModel().getNumberOfSubnets().size() == 2);
		assertTrue("Es wurden nicht alle Verbindungen gesetzt", eModel
				.getCircuitModel().getNumberOfUnrelatedInputs() == 0
				& eModel.getCircuitModel().getNumberOfUnrelatedOutputs() == 0);
		boolean allLoaded = true;
		;
		// Konstruktionsbedingt muss mindestens 1 Element von jedem Typ
		// vorkommen
		for (int n : eModel.getCircuitModel().getNumberOfEachLogicType()
				.values()) {
			if (n < 1) {
				allLoaded = false;
				break;
			}
		}
		assertTrue("Es wurden nicht alle Elemente geladen", allLoaded);
	}

	@Test
	public void saveTest() {
		assertTrue("Es ist ein Fehler beim Speichern aufgetreten",
				eModel.saveCircuit(name, location));
		// Da sich die Schaltung durch das Speichern nicht ändern darf, muss der
		// loadTest() ohne Probleme ausgeführt werden können
		loadTest();
	}
}
